package reflect;

import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * Author itcast
 * Date 2021/10/13 11:08
 * 通过配置文件中的变量
 * 来执行程序
 * 开发步骤：
 * 1.读取resources目录下配置文件的 clazz 和 methods
 * 2.反射机制实例化当前对象
 * 3.获取当前的方法 eat
 * 4.执行程序得到结果
 */
public class ReflectDemo {
   /* static InputStream resourceAsStream = ReflectDemo
            .class.getClassLoader()
            .getResourceAsStream("D:\\project\\sz25\\base-java\\day05_reflect_IO\\resources\\conf.properties");
    */
    //定义 properties
    static Properties props = new Properties();
    static {  //在类被实例化之前就会装载
        //静态代码块 > 动态代码块 > 构造方法调用
        /*try {
            props.load(resourceAsStream);
        } catch (IOException e) {
            e.printStackTrace();
        }*/
    }


    public static void main(String[] args) throws ClassNotFoundException, IOException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        //获取指定位置的配置文件
        FileReader fr =
                new FileReader("D:\\project\\sz25\\base-java\\day05_reflect_IO\\src\\conf.properties");
        //将配置文件中的配置导入到 Properties 中
        props.load(fr);
        System.out.println(props.getProperty("methods"));
        //2.反射机制实例化当前对象 当前对象的 Class 对象
        Class<?> clazz = Class.forName(props.getProperty("clazz"));
        //实例化 等价于 Student o = new Student()
        Student o = (Student) clazz.newInstance();
        //3.获取当前的方法 eat
        Method eat = clazz.getDeclaredMethod(props.getProperty("methods"), String.class, String.class);
        //4.执行程序得到结果
        eat.invoke(o,"跑步","2公里");
    }
}
